#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>


//1.一个信号进入信号处理逻辑时，是否可被另一个信号打断->可以被另一个信号打断
//2.一个信号进入信号处理逻辑时，当前信号的block表中的相应位是否被置为1:再次发送同样信号,pending表是否为1，有无进入处理流程；如何拿到block表，可以使用sigprocmask
//3.是否可以使用sa_mask以屏蔽其它信号:可以使用sa_mask屏蔽其它信号，但不要与signal同时使用，signal会使得进入信号处理逻辑时，只屏蔽当前信号！！！

void Handler(int signo)
{
    sigset_t block,pending;
    sigemptyset(&block);
    sigemptyset(&pending);

    sigprocmask(SIG_SETMASK,nullptr,&block);
    std::cout << "信号2被自定义捕捉" << std::endl;
    std::cout << "信号2的block表结果:" << sigismember(&block,2) << std::endl;
    std::cout << "信号3的block表结果:" << sigismember(&block,3) << std::endl;
    while(1)
    {
        sigpending(&pending);
        std::cout << "当前进程的pid为" << getpid() << "信号2的pending表结果:" << sigismember(&pending,2) << std::endl;
        sleep(1);
    }
}
int main()
{
    //使用sa_mask屏蔽1号信号
    // signal(2,Handler);
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = Handler;
    sigaddset(&sa.sa_mask,3);//设置3号信号额外屏蔽：并不是永久性地屏蔽，仅仅是当2号信号进入信号处理逻辑时，额外屏蔽1号信号
    sigaction(2,&sa,nullptr);
    while(1);
    return 0;
}